package com.cskaoyan.javase.array._7two;

/**
 * @description: 打印杨辉三角
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.Arrays;

/**
 * 1
 * 1 1
 * 1 2 1
 * 1 3 3 1
 * 1 4 6 4 1
 * 1 5 10 10 5 1
 * ...
 *
 * 观察一下图形的特点:
 *      1,每行的首尾元素都是1
 *      2,每行的除开首尾元素,它的取值是上一行的元素 + 上一行左边一个元素
 *
 * 将图形转换成二维数组: 将每一行元素看成是一个一维数组,然后组合起来就是一个二维数组
 * 接下来声明和初始化二维数组
 *
 * 推荐写代码时,先想好思路,最好把注释写好,再开始写代码
 *
 * 1,动态初始化格式二去定义二维数组
 * 2,给其中的一维数组赋值
 * 3,首尾元素赋值为1
 * 4,中间元素赋值
 * 5,打印数组
 *
 */
public class Demo3 {
    public static void main(String[] args) {
        printYangHui(10);
    }

    //参数m表示杨辉三角的行数
    public static void printYangHui(int m) {
        //声明和初始化二维数组
        int[][] yangHui = new int[m][];
        //动态初始化格式二创建的二维数组元素全是null,不能直接使用,需要给一维数组赋值/初始化
        //遍历二维数组中的一维数组
        for (int i = 0; i < yangHui.length; i++) {
            //动态初始化一维数组
            yangHui[i] = new int[i + 1];
        }
        System.out.println(Arrays.deepToString(yangHui));
        //接下来就开始赋值
        //将每行的首尾元素赋值为1,使用普通嵌套for循环
        //外层是在遍历一维数组的地址(引用)
        for (int i = 0; i < yangHui.length; i++) {
            //给首尾元素赋值为1
            yangHui[i][0] = 1;
            yangHui[i][yangHui[i].length - 1] = 1;
        }
        //写完一部分测试一部分,看看有没有问题
        System.out.println(Arrays.deepToString(yangHui));

        //需要给中间元素赋值
        //每行的除开首尾元素,它的取值是上一行的元素 + 上一行左边一个元素
        //比如元素yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1]
        for (int i = 2; i < yangHui.length; i++) {
            for (int j = 1; j < yangHui[i].length - 1; j++) {
                //赋值
                yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1];
            }
        }
        System.out.println(Arrays.deepToString(yangHui));
        //使用杨辉三角的方式打印该二维数组
        for (int i = 0; i < yangHui.length; i++) {
            for (int j = 0; j < yangHui[i].length; j++) {
                System.out.print(yangHui[i][j] + "\t");
            }
            System.out.println();
        }

    }
}
